//==============================================================================================
/**
 * @file	snd_tool.h
 * @brief	サウンドツール関数
 * @author	Satoshi Nohara
 * @date	2005.06.09
 */
//==============================================================================================
#ifndef __SND_TOOL_H__
#define __SND_TOOL_H__

#include "system/snd_def.h"
#include "system/snd_play.h"

//サウンドデータの指定を番号ではなく、サウンドデザイナーが定義したラベルで行えるようになる
//C:\NitroSystem\build\demos\snd\data
//#include "C:\NitroSystem\tools\nitro\SoundPlayer\data\sound_data.sadl"
//#include "data/sound/sound_data.sadl"		//サウンドラベルファイル
#include "data/sound/gs_sound_data.sadl"	//サウンドラベルファイル


//==============================================================================================
//
//	定義
//
//==============================================================================================
//sound_data.sarcの変更は、注意する！
//#define SND_PLAYER_EXTRA_CH		(13)		//予備のチャンネル(通信バトルボイスチャットで使用)
//#define SND_PLAYER_EXTRA_CH		(0)		//予備のチャンネル(通信バトルボイスチャットで使用)
//●ボイスチャットチャンネル
//src/wifi/vchat.c
//cArray[3] = {0, 0, 0};
//直値で使用しているので注意！
///////////////////////////////////////////////////////////

//サウンドシステム状態定義
enum{
	//SND_STATUS_INIT = 0,
	//SND_STATUS_PLAYSTART,
	//SND_STATUS_FADENEXT,
	//SND_STATUS_FADENEXTFADE,
	SND_STATUS_STOP = 0,					//停止
	SND_STATUS_PLAY,						//再生
	SND_STATUS_PLAING,						//再生中
	SND_STATUS_FADEIN,						//フェードイン
	SND_STATUS_FADEOUT,						//フェードアウト
	SND_STATUS_FADEOUT_NEXT_PLAY,			//フェードアウト → 追加波形読み込む → BGM再生
	SND_STATUS_FADEOUT_NEXT_FADEIN,			//フェードアウト → 追加波形読み込む → BGMフェードイン
	SND_STATUS_TRACKFADE,					//トラックフェード
};

//再生速度定義
enum{
	WAVEOUT_PLAY_SPDx05		=	(32768 / 2),				//2分の1倍速
	WAVEOUT_PLAY_SPDx1		=	(32768),					//1倍速
	WAVEOUT_PLAY_SPDx2		=	(32768 * 2),				//2倍速
	WAVEOUT_PLAY_SPDx3		=	(32768 * 3),				//3倍速
};

//フェードフレーム定義
enum{
	BGM_FADE_ZUKAN_TIME		=	(15),						//図鑑画面BGM
	BGM_FADE_ZUKAN_NAKIGOE_TIME	 =	(3),					//図鑑鳴き声画面BGM
	BGM_FADE_TR_CASE_TIME	= 	(15),						//トレーナーケースBGM
	BGM_FADE_ROOM_TIME		=	(30),						//室内切り替え
	BGM_FADE_FIELD_TIME		= 	(60),						//フィールド(ゾーン)切り替え
	BGM_FADE_CAVE_TIME		=	(60),						//洞窟の出入り
	BGM_FADE_TANKOU_TIME	= 	(60),						//炭鉱のBGM切り替え
	BGM_FADE_CLIP_TIME		= 	(30),						//イメージクリップ切り替え
	BGM_FADE_VCHAT_TIME		= 	(30),						//ボイスチャット切り替え
	BGM_FADE_OTHERS_TIME	= 	(60),						//その他
	BGM_FADE_UG_TIME		= 	(30),						//地下への行き来
	BGM_FADE_MAPJUMP_TIME	= 	(40),						//map_jump.c

	BGM_FADE_POKECEN_TIME	= 	(15),						//wifiクラブからポケセンに切り替え
};

//フェードモード定義(fld_bgm.c)
enum{
	BGM_FADE_ROOM_MODE		=	(0),						// 建物の出入り
	BGM_FADE_FIELD_MODE,									// フィールドの切り替え
	BGM_FADE_CAVE_MODE,										// 洞窟の出入り
	BGM_FADE_OTHERS_MODE,									// その他
	BGM_FADE_NAMINORI_MODE,									// 波乗り
};

//シーン(場面)定義
enum{
	SND_SCENE_DUMMY = 0,				//ダミー(クリアコード)

	//メイン画面
	SND_SCENE_MAIN = 1,					//スタートナンバー
	SND_SCENE_TITLE = SND_SCENE_MAIN,	//タイトル
	SND_SCENE_OPENING,					//オープニング
	SND_SCENE_TRADE,					//交換デモ
#if 0
	SND_SCENE_FIELD,					//フィールド
#else
	SND_SCENE_DUMMY_F,					//フィールド(ダミー)
#endif
	SND_SCENE_BATTLE,					//バトル
	SND_SCENE_CONTEST,					//コンテスト
	SND_SCENE_CON_IMAGE,				//イメージクリップ(コンテスト)(06.04.18)
	SND_SCENE_DENDOU,					//殿堂デモ
	SND_SCENE_AGB,						//AGBのポケモンをもってくる画面
	SND_SCENE_HUSIGI,					//ふしぎなおくりもの画面
	SND_SCENE_P2P,						//P2P画面(専用ロード処理)
	SND_SCENE_NUTMIXER,					//料理
	//SND_SCENE_WORLDTRADE,				//世界交換(GTC)
	SND_SCENE_EGG,						//タマゴ孵化
	SND_SCENE_ENDING,					//エンディング
	SND_SCENE_GURUGURU,					//ぐるぐる交換
	SND_SCENE_BCT,						//玉いれ
	SND_SCENE_EMAIL,					//Eメール
	SND_SCENE_GIRA,						//ギラティナイベント(画面切り替え)
	SND_SCENE_WIFI_LOBBY_GAME,			//WiFiロビーミニゲーム
	SND_SCENE_WIFI_LOBBY_PARADE,		//WiFiロビーパレード(広場と同じ場所なのでいらない)
	SND_SCENE_WIFI_LOBBY_HIROBA,		//WiFiロビー(広場)(ニュース、足跡、地球儀もこのまま)
	SND_SCENE_DEMO01,					//
	SND_SCENE_WIFI_WORLD_TRADE,			//WiFi世界交換
	SND_SCENE_THLON,					//ポケスロン
	SND_SCENE_THLON_OPED,				//ポケスロン開会式、閉会式

	//サブ画面(メイン画面から呼ばれる)
	SND_SCENE_SUB = 51,					//スタートナンバー
	SND_SCENE_SUB_BAG = SND_SCENE_SUB,	//バッグ
	SND_SCENE_SUB_NAMEIN,				//名前入力
	SND_SCENE_SUB_IMAGE,				//イメージクリップ
	SND_SCENE_SUB_ZUKAN,				//図鑑
	SND_SCENE_SUB_TOWNMAP,				//タウンマップ
	SND_SCENE_SUB_TRCARD,				//トレーナーカード
	SND_SCENE_SUB_POKELIST,				//ポケモンリスト
	SND_SCENE_SUB_DIG,					//化石掘り
	SND_SCENE_SUB_CUSTOM,				//カスタムボール
	SND_SCENE_SUB_FIRSTPOKE,			//最初のポケモン選択
	SND_SCENE_SUB_PST,					//ポケモンステータス
	SND_SCENE_SUB_PMS,					//簡易会話
	SND_SCENE_SUB_CLIMAX,				//クライマックス(テンガン山)画面切り替えではない！
	SND_SCENE_SUB_SLOT,					//スロット
	SND_SCENE_SUB_FNOTE,				//冒険ノート
	SND_SCENE_SUB_SCRATCH,				//スクラッチ

	//GS追加分
	SND_SCENE_SUB_SAFARI,				//サファリレイアウト
	SND_SCENE_SUB_LINEAR,				//リニアデモ
	SND_SCENE_SUB_PLANTER,				//きのみプランタ
	SND_SCENE_SUB_COIN,					// コインゲーム
	SND_SCENE_SUB_DENDOU,				// 殿堂入り
	SND_SCENE_SUB_JUICE,				// ぼんジュース
	SND_SCENE_SUB_PHC,					// PHC
	SND_SCENE_SUB_SEKIBAN,				// 石版パズル
	SND_SCENE_SUB_EVENT,				// ホウオウ・ルギアイベント（アプリとは別）

	//シーン関連処理
	//Snd_DataSetByScene( u8 scene, u16 no, int flag );
	//Snd_LoadSeByScene( u8 scene );
};

//サウンドハンドル定義
enum{
	SND_HANDLE_FIELD = 0,									//フィールドBGMサウンドハンドル
	SND_HANDLE_PMVOICE,										//ポケモン鳴き声サウンドハンドル
	SND_HANDLE_ME,											//MEサウンドハンドル
	SND_HANDLE_SE_1,										//SEサウンドハンドル
	SND_HANDLE_SE_2,										//SEサウンドハンドル
	SND_HANDLE_SE_3,										//SEサウンドハンドル
	SND_HANDLE_SE_4,										//SEサウンドハンドル
	SND_HANDLE_BGM,											//フィールド以外のBGMハンドル
	SND_HANDLE_CHORUS,										//コーラス(鳴き声専用)ハンドル

	SND_HANDLE_MAX,											//最大数
};

//サンプリングレートが低いと、キャプチャ機能を使う時に、
//何も加工していなくても、音が悪くなるので注意！
#define REVERB_SAMPLING_RATE	(16000)						//サンプリングレート(リバーブ)
#define SAMPLING_RATE		(8000)							//サンプリングレート
//#define SAMPLING_RATE		(32000)//(8000)					//サンプリングレート
//#define SAMPLING_TIME		(2)								//サンプリングする時間
//#define WAVE_SAMPLE		(SAMPLING_RATE * SAMPLING_TIME)	//サンプリングに必要なデータ量

#define WAVEOUT_CH_NORMAL	(14)							//波形で使用するチャンネルNO
#define WAVEOUT_CH_CHORUS	(15)							//波形で使用するチャンネルNO(コーラス)

//フェードインする時の開始音量定義
#define BGM_FADEIN_START_VOL_MIN	(0)						//フェードインする時の開始音量=0
#define BGM_FADEIN_START_VOL_NOW	(1)						//フェードインする時の開始音量=今のまま

//次のBGMを鳴らすまでのウェイト
#define BGM_NEXT_WAIT_CAVE_TIME	(15)						//洞窟の出入り

//フェードインフレーム数
#define BGM_FADEIN_CYCLE_TIME	(30)					//自転車に乗っている時のフェードイン
#define BGM_FADEIN_RESTART_TIME	(30)					//ゲームオーバー後に再開する時のフェードイン

#define FILTER_SIZE				(8)							//フィルターサイズ

#define SEQ_DP_TRADE			(SEQ_GS_KOUKAN)				//交換画面BGMナンバー

//サウンドTCBの定義
enum{
	SND_TCB_PMVOICE_LENGTH = 0,				//鳴き声再生時間

	SND_TCB_MAX,							//最大数
};

//図鑑鳴き声画面
//#define SND_ZUKAN_PITCH_MIN		(-(64*12) * 1)		//ピッチの最低数
#define SND_ZUKAN_PITCH_MIN		(-(64*12) * 2)			//ピッチの最低数
#define SND_ZUKAN_PITCH_CHORUS	(20)					//コーラスのずれピッチ

//Snd_PMVoicePlayExの引数に指定
#define PV_PTN_PARAM_NONE		(0x1ff)					//鳴き声パラメータなし

#define SND_BANK_CONTINUE		(0)						//バンクそのまま継続
#define SND_BANK_CHANGE			(1)						//バンク切り替える

#define SND_HALF_PITCH			(64)					//半音の値

#define SND_VCHAT_VOL_LV		(5)						//ボイスチャット中に音量を下げるレベル

//WIFI広場で自分が鳴らした音を再生する専用プレイヤーナンバー
#define SND_PLAYER_NO_WIFI_HIROBA	(PLAYER_SE_3)		//

#define SND_PV_WORK_MAX			(2)						//鳴き声ウェイトワーク最大数

// Snd_PlayerSetTrackPitch,Snd_PlayerSetTrackPanの指定で使用するチャンネルビットマスク指定
#define SND_TRACK_BITMASK		( 0xffff )

// Snd_GetPlayerNoを呼んだ時にプレイヤーハンドルが存在しなかった時の値
#define SND_SOUNDPLAYER_NONE	( 0xff )



//==============================================================================================
//
//	構造体宣言
//
//==============================================================================================
//波形データ再生に必要なデータ構造体
typedef struct{
	NNSSndWaveOutHandle*	handle;					//波形再生ハンドル
	NNSSndWaveFormat		format;					//波形データフォーマット
	const void*				dataaddr;				//波形データの先頭アドレス
	BOOL					loopFlag;				//ループフラグ
	int						loopStartSample;		//ループ開始サンプル位置
	int						samples;				//波形データのサンプル数
	int						sampleRate;				//波形データのサンプリングレート
	int						volume;					//音量
	int						speed;					//再生スピード
	int						pan;					//パン(0-127)
}WAVEOUT_WORK;

typedef s16 smp_t;

//キャプチャエフェクトのコールバック構造体
typedef struct EffectCallbackInfo{
    smp_t sample[ FILTER_SIZE-1 ][2];
} EffectCallbackInfo;


//==============================================================================================
//
//	extern宣言
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	シーケンスアーカイブ番号を設定
 *
 * @param	p		サウンドハンドルのアドレス
 * @param	arc_no	シーケンスアーカイブ番号
 * @param	index	インデックス
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_PlayerSetSeqArcNo( NNSSndHandle *p, int arc_no, int index );

//--------------------------------------------------------------
/**
 * @brief	フィールドBGM固定フラグセット(セーブはしない)
 *
 * @param	flag	1=BGM切り替わらない、0E=BGM切り替わる(通常)
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_CtrlBgmFlagSet( u8 flag );

//--------------------------------------------------------------
/**
 * @brief	フィールドBGM固定フラグチェック(セーブはしない)
 *
 * @param	none
 *
 * @retval	"1=BGM切り替わらない、0E=BGM切り替わる(通常)"
 */
//--------------------------------------------------------------
extern u8 Snd_CtrlBgmFlagCheck( void );

//--------------------------------------------------------------
/**
 * @brief	今のBGMナンバー更新
 *
 * @param	no		更新するBGMナンバー
 *
 * @retval	none
 *
 * 次のBGMナンバー(next_bgm_no)をクリアしている！
 */
//--------------------------------------------------------------
extern void Snd_NowBgmNoSet( u16 no );

//--------------------------------------------------------------
/**
 * @brief	今のBGMナンバー取得
 *
 * @param	none
 *
 * @retval	"今のBGMナンバー"
 */
//--------------------------------------------------------------
extern u16 Snd_NowBgmNoGet();

//--------------------------------------------------------------
/**
 * @brief	次のBGMナンバー更新
 *
 * @param	no		更新するBGMナンバー
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_NextBgmNoSet( u16 no );

//--------------------------------------------------------------
/**
 * @brief	次のBGMナンバー取得
 *
 * @param	none
 *
 * @retval	"次のBGMナンバー"
 */
//--------------------------------------------------------------
extern u16 Snd_NextBgmNoGet();

//--------------------------------------------------------------
/**
 * @brief	ゲームボーイのBGMナンバー更新
 *
 * @param	no		更新するBGMナンバー
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_GameBoyBgmNoSet( u16 no );

//--------------------------------------------------------------
/**
 * @brief	ゲームボーイのBGMナンバー取得
 *
 * @param	none
 *
 * @retval	"ゲームボーイのBGMナンバー"
 */
//--------------------------------------------------------------
extern u16 Snd_GameBoyBgmNoGet();

//--------------------------------------------------------------
/**
 * @brief	ゾーンBGMナンバーセット
 *
 * @param	bgm		BGMナンバー
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_ZoneBgmSet( u16 bgm );


//==============================================================================================
//
//	シーケンス関連
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	シーケンスを再生(プレイヤー番号指定)(通常使用しない！)
 *
 * @param	handle_no	サウンドハンドルナンバー
 * @param	player_no	プレイヤーナンバー
 * @param	no			BGMナンバー
 *
 * @retval	"再生成功=TRUE、失敗=FALSE"
 *
 * 再生に成功すると、サウンドハンドルにシーケンスが結びつけられます。
 *
 * シーケンスデータをプレイヤーヒープでロードする時は、
 * 容量が足りないと再生失敗する！
 */
//--------------------------------------------------------------
extern BOOL Snd_ArcPlayerStartSeqEx( int handle_no, int player_no, u16 no );


//==============================================================================================
//
//	プレイヤー関連
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	再生中のシーケンスの数を返す
 *
 * @param	player_no	プレイヤー番号
 *
 * @retval	"再生中のシーケンスの数"
 */
//--------------------------------------------------------------
extern int Snd_PlayerCountPlayingSeq( int player_no );

//--------------------------------------------------------------
/**
 * @brief	指定プレイヤーのシーケンス最大同時再生数を設定(多重再生をしたい時に使用！)
 *
 * @param	player_no	プレイヤー番号
 * @param	no			シーケンス最大同時再生数
 *
 * @retval	"変更前のシーケンス最大同時再生数"
 *
 * PLAYER_FIELD	: フィールドBGM
 * PLAYER_ME 	: ME
 * PLAYER_SE_1 	: 効果音
 * PLAYER_SE_2 	: 効果音
 * PLAYER_SE_3 	: 効果音
 * PLAYER_SE_4 	: 効果音
 * PLAYER_PV	: ポケモン鳴き声
 * PLAYER_VOICE	: 音声
 * PLAYER_BGM	: フィールド以外BGM
 *
 * 使用後は、必ず元の設定に戻すようにして下さい！
 */
//--------------------------------------------------------------
//extern u8 Snd_PlayerSetPlayableSeqCount( int player_no, int no );

//--------------------------------------------------------------
/**
 * @brief	シーケンスナンバーからプレイヤーナンバー取得
 *
 * @param	no		シーケンスナンバー
 *
 * @retval	"プレイヤーナンバー"、無かったらSND_SOUNDPLAYER_NONE(0xff)
 */
//--------------------------------------------------------------
extern u8 Snd_GetPlayerNo( u16 no );

//--------------------------------------------------------------
/**
 * @brief	サウンドハンドルからシーケンスナンバーを取得
 *
 * @param	p			サウンドハンドルのアドレス
 *
 * @retval	"シーケンスナンバー"
 */
//--------------------------------------------------------------
extern int Snd_GetSeqNo( NNSSndHandle *p );


//==============================================================================================
//
//	バンク関連
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	バンク情報構造体のアドレスを取得
 *
 * @param	no		シーケンスナンバー
 *
 * @retval	"バンク情報構造体のアドレス"
 */
//--------------------------------------------------------------
extern const NNSSndArcBankInfo* Snd_GetBankInfo( int no );

//--------------------------------------------------------------
/**
 * @brief	シーケンスナンバーからバンクナンバー取得
 *
 * @param	no		シーケンスナンバー
 *
 * @retval	"0=エラー、0以外=バンクナンバー"
 */
//--------------------------------------------------------------
extern u16 Snd_GetBankNo( int no );


//==============================================================================================
//
//	サウンドデータのロード関連
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	シーンセット
 *
 * @param	scene	シーン
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_SceneSet( u8 scene );

//--------------------------------------------------------------
/**
 * @brief	サブシーンセット
 *
 * @param	sub_scene	サブシーン
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_SubSceneSet( u8 sub_scene );

extern void Snd_SubSceneClear( void );

//--------------------------------------------------------------
/**
 * @brief	シーンをキーにして、SEデータをロード(シーン定義はsnd_tool.h参照)
 *
 * @param	scene		シーン
 *
 * @retval	"成功=TRUE、失敗=FALSE"
 */
//--------------------------------------------------------------
extern int Snd_LoadSeByScene( u8 scene );

//--------------------------------------------------------------
/**
 * @brief	SND_SCENE_FIELD サウンドデータセット
 *
 * @param	no		シーケンスナンバー
 *
 * @retval	"0=何もしない、1=データロード"
 *
 * 現在のシーンと、渡されたシーンが同じ時は、
 * サウンドデータをロードする必要がないので何もしない！
 */
//--------------------------------------------------------------
extern BOOL Snd_FieldSceneDataSetSub( u16 no );

//--------------------------------------------------------------
/**
 * @brief	シーンをキーにして、サウンドデータセット
 *
 * @param	scene	シーン
 * @param	no		シーケンスナンバー
 * @param	flag	"未使用"
 *
 * @retval	"0=何もしない、1=データロード"
 */
//--------------------------------------------------------------
extern BOOL Snd_DataSetByScene( u8 scene, u16 no, int flag );

//--------------------------------------------------------------
/**
 * @brief	フィールドデータセットの共通処理(snd_tool.c,snd_play.c)
 *
 * @param	no			シーケンスナンバー
 * @param	old_bank_no	フィールドのバンクナンバー
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_FieldDataSetSub( u16 no, u16 old_bank_no );

//--------------------------------------------------------------
/**
 * @brief	視線曲に切り替わる時のサウンドデータセット
 *
 * @param	no		シーケンスナンバー
 *
 * @retval	none
 *
 * FIELDから呼ばれることを前提としている！
 */
//--------------------------------------------------------------
extern void Snd_EyeBgmSet( u16 no );

//--------------------------------------------------------------
/**
 * @brief	何もロードしていない状態にする(サウンドテストのみで使う)
 *
 * @param	none
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_HeapStateClear(void);


//==============================================================================================
//
//	ヒープ関連
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	BGMの後ろのデータを消す
 *
 * @param	none
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_DeleteHeapAfterBgm( void );

//--------------------------------------------------------------
/**
 * @brief	階層レベルを取得
 *
 * @param	wk		SND_WORK型のアドレス
 * @param	type	階層レベル状態(snd_tool.h参照)
 *
 * @retval	"階層レベル"
 */
//--------------------------------------------------------------
extern int Snd_GetHeapSaveLv( int type );


//==============================================================================================
//
//	シーケンス関連
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	シーケンスを一時停止または再開します。
 *
 * @param	player	プレイヤーナンバー(sound_data.sadl参照)
 * @param	flag	TRUE=一時停止、FALSE=再開
 *
 * @retval	none
 *
 * サウンドハンドルが無効の場合は、何もしません。
 * 状態が変わらない場合、例えば、すでに一時停止状態の時に一時停止を行っても、何もしません。
 *
 * 注意
 * 一時停止を行うと、発音中の音は強制的に停止させられます。
 * 再開を行っても、発音中の音が続きから再生されることはありませんので注意してください。
 * 再開後は、次のノートオンから音が鳴り始めます。
 */
//--------------------------------------------------------------
extern void Snd_PlayerPause( u8 player, BOOL flag );

//--------------------------------------------------------------
/**
 * @brief	全てのポーズしているかフラグのクリア
 *
 * @param	none
 *
 * @retval	none
 *
 * 戦闘でゲームオーバーになって、ポケセンに戻るときなどに、
 * FieldDataSetを呼ぶ前に、ポーズフラグをクリアしないといけない！
 */
//--------------------------------------------------------------
extern void Snd_PauseClearAll();	//Snd_GameOverSetから呼ぶように変更

//--------------------------------------------------------------
/**
 * @brief	シーケンスのボリュームを徐々に変更する
 *
 * @param	handle_no	サウンドハンドルナンバー
 * @param	vol			ボリューム
 * @param	frame		フレーム
 *
 * @retval	none
 *
 * framesが0の時、即座に現在のボリューム値が更新されます。
 * たとえば、現在のボリューム値とは無関係に、
 * ボリュームをある値から、別の値に時間変化させたい場合は、
 * まず、framesを0としてこの関数を呼びだして、現在のボリューム値を更新した後、
 * 再び同じ関数で、目標とするボリューム値を指定します。
 *
 * シーケンススタート直後のボリューム値は0で、次の NNS_SndMain関数で、127 に変化します。
 * このため、シーケンススタート直後にこの関数を呼びだすと、
 * ボリューム0から徐々に指定のボリュームへ変化するような、フェードイン効果が得られます。
 *
 * このボリューム値は、 NNS_SndPlayerSetVolume関数の値とは、独立して効果を発揮し、
 * 互いに重ね合わされます。ただし、フェードアウト中は、ここで設定した値は無視されます。
 */
//--------------------------------------------------------------
extern void Snd_PlayerMoveVolume( int handle_no, int vol, int frame );

//--------------------------------------------------------------
/**
 * @brief	全てのシーケンスのボリュームを変更する
 *
 * @param	p		サウンドハンドルのアドレス
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_AllPlayerMoveVolume( int vol, int frame );

//--------------------------------------------------------------
/**
 * @brief	シーケンスの初期ボリューム設定
 *
 * @param	handle_no	サウンドハンドルナンバー
 * @param	vol			ボリューム(0-127)
 *
 * @retval	none
 *
 * サウンドハンドルが無効の場合は、何もしません。
 *
 * ボリュームのデフォルト値は、最大の127です。
 * この値の影響はシーケンス全体にかかります。
 *
 * この関数は、NNS_SndArcPlayerStartSeq*関数と NNS_SndArcPlayerStartSeqArc*関数内で
 * 呼びだされています。再度、この関数を呼びだすと、設定した値が上書きされます。
 * 上書きしたくない場合は、 NNS_SndPlayerSetVolume関数などを使ってください。
 */
//--------------------------------------------------------------
extern void Snd_PlayerSetInitialVolume( int handle_no, int vol );

//--------------------------------------------------------------
/**
 * @brief	ボイスチャット中の音量操作(シーケンスナンバー指定版)
 *
 * @param	seq_no		シーケンスナンバー
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_VChatVolSetBySeqNo( int seq_no );

//--------------------------------------------------------------
/**
 * @brief	ボイスチャット中の音量操作(シーケンスナンバー、ハンドルナンバー指定版)
 *
 * @param	seq_no		シーケンスナンバー
 * @param	handle_no	ハンドルナンバー
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_VChatVolSet( int seq_no, int handle_no );

//--------------------------------------------------------------
/**
 * @brief	シーケンスパラメータから音量を取得
 *
 * @param	seq_no		シーケンスナンバー
 *
 * @retval	"ボリューム、無効な場合は0を返します"
 */
//--------------------------------------------------------------
extern u8 Snd_SeqVolGet( int seq_no );

//--------------------------------------------------------------
/**
 * @brief	シーケンスの初期ボリューム設定(シーケンスナンバー指定版)
 *
 * @param	no		シーケンスナンバー
 * @param	vol		ボリューム(0-127)
 *
 * @retval	none
 *
 * サウンドハンドルが無効の場合は、何もしません。
 *
 * ボリュームのデフォルト値は、最大の127です。
 * この値の影響はシーケンス全体にかかります。
 *
 * この関数は、NNS_SndArcPlayerStartSeq*関数と NNS_SndArcPlayerStartSeqArc*関数内で
 * 呼びだされています。再度、この関数を呼びだすと、設定した値が上書きされます。
 * 上書きしたくない場合は、 NNS_SndPlayerSetVolume関数などを使ってください。
 *
 * 例
 * Snd_PMVoicePlay( no );
 * Snd_PlayerSetInitialVolume( handle_no. 30 );
 * ボリューム30で再生される
 *
 * そのあと、
 * Snd_PMVoicePlay( no );
 * デフォルトの値127で再生される(元に戻っている)
 *
 * 逆にいうと、常にボリューム30にしたかったら、
 * Snd_PlayerSetInitialVolume( handle_no. 30 );
 * を毎回セットする
 */
//--------------------------------------------------------------
extern void Snd_PlayerSetInitialVolumeBySeqNo( u16 no, int vol );

//--------------------------------------------------------------
/**
 * @brief	トラック音程変更
 *
 * @param	handle_no	サウンドハンドルナンバー
 * @param	bitmask		トラックビットマスク(DPでは全部SND_TRACK_BITMASK(=0xffff))
 * @param	pitch		音程変化の値(-32768〜32767)
 *
 * @retval	none
 *
 * pitchは正の値で高い方へ、負の値で低い方へ変化します。
 * ±64でちょうど半音変化します。（呼ぶたびに効果が累積されるわけではありません)
 */
//--------------------------------------------------------------
extern void Snd_PlayerSetTrackPitch( int handle_no, u16 bitmask, int pitch );

//--------------------------------------------------------------
/**
 * @brief	トラック音程変更(シーケンスナンバー指定版)
 *
 * @param	no			シーケンスナンバー
 * @param	bitmask		トラックビットマスク
 * @param	pitch		音程変化の値(-32768〜32767)
 *
 * @retval	none
 *
 * pitchは正の値で高い方へ、負の値で低い方へ変化します。
 * ±64でちょうど半音変化します。（呼ぶたびに効果が累積されるわけではありません)
 */
//--------------------------------------------------------------
extern void Snd_PlayerSetTrackPitchBySeqNo( u16 no, u16 bitmask, int pitch );

//--------------------------------------------------------------
/**
 * @brief	トラック音程変更(プレイヤーナンバー指定版)
 *
 * @param	player_no	プレイヤーナンバー
 * @param	bitmask		トラックビットマスク
 * @param	pitch		音程変化の値(-32768〜32767)
 *
 * @retval	none
 *
 * pitchは正の値で高い方へ、負の値で低い方へ変化します。
 * ±64でちょうど半音変化します。（呼ぶたびに効果が累積されるわけではありません)
 */
//--------------------------------------------------------------
extern void Snd_PlayerSetTrackPitchByPlayerNo( u8 player_no, u16 bitmask, int pitch );

//--------------------------------------------------------------
/**
 * @brief	トラックパン変更
 *
 * @param	handle_no	サウンドハンドルナンバー
 * @param	bitmask		トラックビットマスク(DPでは全部SND_TRACK_BITMASK(=0xffff))
 * @param	pan			パン変化の値(-128〜127)
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_PlayerSetTrackPan( int handle_no, u16 bitmask, int pan );


//==============================================================================================
//
//	マイク関連
//
//==============================================================================================
//----------------------------------------------------------------------------
/**
 *	@brief	AMPをONにしてから3秒待ったかどうかのフラグ取得
 *					マイクはこれがONにならないと使用してはいけない（任天堂規約）
 *
 *	@retval	TRUEならば使用許可
 *	@retval	FALSEならば使用不許可
 */
//-----------------------------------------------------------------------------
extern BOOL Snd_MicIsAmpOnWaitFlag( void );

//--------------------------------------------------------------
/**
 * @brief	録音開始
 *
 * @param	p		MICAutoParam型のポインタ
 *
 * @retval	"MIC_RESULT_SUCCESS		処理が正常に完了"
 * @retval	"それ以外				何らかの原因で失敗"
 */
//--------------------------------------------------------------
extern MICResult Snd_MicStartAutoSampling( MICAutoParam* p );

//--------------------------------------------------------------
/**
 * @brief	録音停止
 *
 * @param	none
 *
 * @retval	"MIC_RESULT_SUCCESS		処理が正常に完了"
 * @retval	"それ以外				何らかの原因で失敗"
 */
//--------------------------------------------------------------
extern MICResult Snd_MicStopAutoSampling(void);


//-----------------------------------------------------------------------------
/**
 *      オートサンプリングスリープ時処理
 */
//-----------------------------------------------------------------------------
extern void Snd_MicStopSleep(void);     // スリープ開始
extern void Snd_MicReStartSleep(void);   // スリープから復帰


//--------------------------------------------------------------
/**
 * @brief	手動録音
 * @param	type      サンプリングレートのタイプ
 * @param	heap      記録領域
 * @param	callback  記録した際のコールバック
 * @param	arg       コールバックに渡す引数ポインタ
 * @retval	"MIC_RESULT_SUCCESS		処理が正常に完了"
 * @retval	"それ以外				何らかの原因で失敗"
 */
//--------------------------------------------------------------
extern MICResult Snd_MicManualSampling(MICSamplingType type ,void* heap,MICCallback callback,void* arg);

//==============================================================================================
//
//	波形再生関連
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	波形ハンドルのアドレスを取得
 *
 * @param	no		使用するチャンネルナンバー
 *
 * @retval	"波形ハンドルのアドレス"
 *
 * BGM		NNSSndHandle
 * 波形		NNSSndWaveOutHandle
 * ハンドルのタイプが違うので注意！
 */
//--------------------------------------------------------------
extern NNSSndWaveOutHandle * Snd_WaveOutHandleGet( u32 no );

//--------------------------------------------------------------
/**
 * @brief	波形再生用にチャンネルを確保する
 *
 * @param	no		使用するチャンネルナンバー
 *
 * @retval	BOOL	TRUE=成功、FALSE=失敗
 */
//--------------------------------------------------------------
extern BOOL Snd_WaveOutAllocChannel( u32 no );

//--------------------------------------------------------------
/**
 * @brief	波形再生用のチャンネルを解放する
 *
 * @param	no		使用するチャンネルナンバー
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_WaveOutFreeChannel( u32 no );

//--------------------------------------------------------------
/**
 * @brief	波形再生
 *
 * @param	p		WAVEOUT_WORK型のポインタ
 * @param	ch		使用するチャンネルナンバー(通常は、WAVEOUT_CH_NORMAL)
 *
 * @retval	BOOL	TRUE=成功、FALSE=失敗
 */
//--------------------------------------------------------------
BOOL Snd_WaveOutStart( WAVEOUT_WORK *p, u32 ch );

//--------------------------------------------------------------
/**
 * @brief	波形停止
 *
 * @param	no		使用するチャンネルナンバー
 *
 * @retval	none
 */
//--------------------------------------------------------------
void Snd_WaveOutStop( u32 no );

//--------------------------------------------------------------
/**
 * @brief	波形再生中かチェック
 *
 * @param	no		使用するチャンネルナンバー
 *
 * @retval	BOOL	TRUE=再生中、FALSE=再生中でない
 */
//--------------------------------------------------------------
extern BOOL Snd_WaveOutIsPlaying( u32 no );

//--------------------------------------------------------------
/**
 * @brief	波形再生のPAN設定
 *
 * @param	no		使用するチャンネルナンバー
 * @param	pan		パンの値(0-127、64がcenter)
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_WaveOutSetPan( u32 no, u8 pan );

//--------------------------------------------------------------
/**
 * @brief	波形再生の再生スピード設定
 *
 * @param	no		使用するチャンネルナンバー
 * @param	spd		再生スピード
 *
 * @retval	none
 *
 * 2分の1倍速	(32768 / 2)
 * 1倍速		(32768)
 * 2倍速		(32768 * 2)
 * 3倍速		(32768 * 3)
 */
//--------------------------------------------------------------
extern void Snd_WaveOutSetSpeed( u32 no, u32 spd );

//--------------------------------------------------------------
/**
 * @brief	波形再生のボリューム変更
 *
 * @param	no		使用するチャンネルナンバー
 * @param	vol		ボリューム値(0-127)
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_WaveOutSetVolume( u32 no, int vol );


//==============================================================================================
//
//	波形逆再生関連(ポケモンの鳴き声専用)
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	逆再生のポケモン鳴き声を再生
 *
 * @param	no		ポケモンナンバー
 * @param	vol		ボリューム(0-127)
 * @param	pan		パン(0-127)
 * @param	ch		使用するチャンネルナンバー(通常は、WAVEOUT_CH_NORMAL)
 * @param	heap_id	ヒープID
 *
 * @retval	BOOL	TRUE=成功、FALSE=失敗
 *
 * 内部で逆再生用のバッファを確保しています。
 *
 * Snd_WaveOutStopReverse(...)を呼んで、
 * バッファを開放してください。
 *
 * ポケモンナンバーと鳴き声の波形アーカイブナンバーが同じになるようにする！
 */
//--------------------------------------------------------------
extern BOOL Snd_WaveOutStartReverse( u16 no, int vol, int pan, u32 ch, int heap_id );

//--------------------------------------------------------------
/**
 * @brief	逆再生のポケモン鳴き声を停止してバッファを開放する
 *
 * @param	no		使用するチャンネルナンバー
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_WaveOutStopReverse( u32 no );


//==============================================================================================
//
//	キャプチャ関連
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	キャプチャースレッドを起動(とりあえず優先度は固定)
 *
 * @param	none
 *
 * @retval	none
 *
 * キャプチャースレッドを起動しておくと、
 * キャプチャー処理がIRQハンドラではなく、
 * キャプチャースレッドで処理されるようになります。
 *
 * スレッドの優先度threadPrioは、
 * 通常、ストリームスレッドよりも高く設定します。
 * 処理が遅れると、正常な再生が行われなくなりますので、注意してください。
 */
//--------------------------------------------------------------
extern void Snd_CaptureCreateThread(void);

//--------------------------------------------------------------
/**
 * @brief	キャプチャが実行中か取得
 *
 * @param	none
 *
 * @retval	"TRUE=実行中、FALSE=実行していない"
 */
//--------------------------------------------------------------
extern BOOL Snd_CaptureIsActive(void);

//--------------------------------------------------------------
/**
 * @brief	実行中のキャプチャタイプを取得
 *
 * @param	none
 *
 * @retval	"NNS_SND_CAPTURE_TYPE_REVERB = リバーブ"
 * @retval	"NNS_SND_CAPTURE_TYPE_EFFECT = エフェクト"
 * @retval	"NNS_SND_CAPTURE_TYPE_SAMPLING = サンプリング"
 *
 * キャプチャーが実行中の時のみ呼びだすことができます。
 * キャプチャーが実行中かどうかを調べるためには、 NNS_SndCaptureIsActive関数を呼びだします。
 */
//--------------------------------------------------------------
extern NNSSndCaptureType Snd_CaptureGetCaptureType(void);

//--------------------------------------------------------------
/**
 * @brief	出力エフェクト処理を変更
 *
 * @param	none
 *
 * @retval	none
 *
 * NNS_SND_CAPTURE_OUTPUT_EFFECT_NORMAL		何も処理しません(通常のステレオモード)
 *
 * NNS_SND_CAPTURE_OUTPUT_EFFECT_MONO		モノラルモード
 *
 * NNS_SND_CAPTURE_OUTPUT_EFFECT_SURROUND	サラウンドモード
 * DSスピーカーから出力させたときに、
 * スピーカー位置より広がって音を感じられるようにするエフェクトをかけます。
 *
 * NNS_SND_CAPTURE_OUTPUT_EFFECT_HEADPHONE	ヘッドフォンモード
 * ヘッドフォン使用時に、耳の負担を軽減するエフェクトをかけます。
 */
//--------------------------------------------------------------
extern void Snd_CaptureChangeOutputEffect( NNSSndCaptureOutputEffectType type );


//==============================================================================================
//
//	キャプチャ　リバーブ
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	出力エフェクト処理を開始
 *
 * @param	none
 *
 * @retval	none
 *
 * キャプチャー機能を使ってミキサー出力をキャプチャし、
 * コールバック関数でエフェクト処理を行った後、最終音声として出力します。
 * エフェクト動作中は、16チャンネル中の2チャンネル（チャンネル1及びチャンネル3）を消費します。
 * チャンネル1またはチャンネル3が、シーケンスによって使用中の場合、
 * 発音中の音は強制的に停止させられます。
 *
 * NNS_SND_CAPTURE_OUTPUT_EFFECT_NORMAL		何も処理しません(通常のステレオモード)
 *
 * NNS_SND_CAPTURE_OUTPUT_EFFECT_MONO		モノラルモード
 *
 * NNS_SND_CAPTURE_OUTPUT_EFFECT_SURROUND	サラウンドモード
 * DSスピーカーから出力させたときに、
 * スピーカー位置より広がって音を感じられるようにするエフェクトをかけます。
 *
 * NNS_SND_CAPTURE_OUTPUT_EFFECT_HEADPHONE	ヘッドフォンモード
 * ヘッドフォン使用時に、耳の負担を軽減するエフェクトをかけます。
 */
//--------------------------------------------------------------
extern void Snd_CaptureStartOutputEffect( NNSSndCaptureOutputEffectType type );

//--------------------------------------------------------------
/**
 * @brief	リバーブ　開始
 *
 * @param	vol		リバーブ成分のボリューム(0-63)
 *
 * @retval	BOOL	TRUE=成功、FALSE=失敗
 *
 * 音声を再生しながらこの関数を呼びだすと、再生される音が途切れます。
 *
 * チャンネル1,3を使用するので注意！
 */
//--------------------------------------------------------------
extern BOOL Snd_CaptureStartReverb( int vol );

//--------------------------------------------------------------
/**
 * @brief	リバーブ　終了
 *
 * @param	frame	フレーム数
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_CaptureStopReverb( int frame );

//--------------------------------------------------------------
/**
 * @brief	リバーブ　ボリューム変更
 *
 * @param	vol		リバーブ成分のボリューム(0-63)
 * @param	frame	フレーム数
 *
 * @retval	none
 *
 * frameで指定したフレーム数で、徐々に現在のボリューム値から、
 * volで指定したボリューム値へ変化します。
 *
 * リバーブが動作していない場合は、何もしません。
 */
//--------------------------------------------------------------
extern void Snd_CaptureReverbVol( int vol, int frame );

//--------------------------------------------------------------
/**
 * @brief	エフェクト開始
 *
 * @param	none
 *
 * @retval	BOOL	TRUE=成功、FALSE=失敗
 *
 * チャンネル1,3を使用するので注意！
 */
//--------------------------------------------------------------
extern BOOL Snd_CaptureStartEffect(void);

//--------------------------------------------------------------
/**
 * @brief	エフェクト停止
 *
 * @param	none
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_CaptureStopEffect(void);

//--------------------------------------------------------------
/**
 * @brief	エフェクトレベルの操作
 *
 * @param	level	レベル(0-8)
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_CaptureEffectLevel( int level );


//==============================================================================================
//
//	トラック操作
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	トラックミュート
 *
 * @param	handle_no	サウンドハンドルナンバー
 * @param	bitmask		トラックビットマスク
 * @param	flag		TRUE=ミュート、FALSE=解除
 *
 * @retval	none
 *
 * trackBitMaskで、設定するトラックを指定します。
 * 下位ビットから順に、トラック0、トラック1、トラック2、、、を表し、
 * ビットが立っているトラック全てに対して、ミュートの設定を変更します。
 * 例えば、トラック2とトラック5のミュート設定を変更したい場合は、
 * (1 << 2) | (1 << 5) すなわち、0x0024 とします。
 */
//--------------------------------------------------------------
extern void Snd_PlayerSetTrackMute( int handle_no, u16 bitmask, BOOL flag );

//--------------------------------------------------------------
/**
 * @brief	トラックボリューム変更
 *
 * @param	p			サウンドハンドルのアドレス
 * @param	bitmask		トラックビットマスク
 * @param	vol			ボリューム
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_PlayerSetTrackVolume( NNSSndHandle *p, u16 bitmask, int vol );

//--------------------------------------------------------------
/**
 * @brief	テンポ変更
 *
 * @param	handle_no	サウンドハンドルナンバー
 * @param	tempo		倍率(256=1倍)
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_PlayerSetTempoRatio( int no, int tempo );


//==============================================================================================
//
//	その他関連
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	モノラルフラグを変更
 *
 * @param	flag	TRUE=モノラル、FALSE=ステレオ
 *
 * @retval	none
 *
 * デフォルトは、FALSEです。
 * モノラルフラグを有効にすると、パンの設定値を無視して、
 * 全ての発音が中央の定位で行われます。
 */
//--------------------------------------------------------------
extern void Snd_SetMonoFlag( BOOL flag );

//--------------------------------------------------------------
/**
 * @brief	フェードカウンターセット(fade_countに値セット)
 *
 * @param	frame		フレーム数
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_FadeCountSet( int frame );

//--------------------------------------------------------------
/**
 * @brief	次のBGMを鳴らすまでのウェイトセット
 *
 * @param	frame		フレーム数
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_NextWaitSet( int frame );

//--------------------------------------------------------------
/**
 * @brief	次のBGMを鳴らすまでのウェイトチェック(カウンターを減らしています)
 *
 * @param	none
 *
 * @retval	"0=終了、0以外=カウンター値"
 */
//--------------------------------------------------------------
extern int Snd_NextWaitCheck();

//--------------------------------------------------------------
/**
 * @brief	マスターボリューム設定(デフォルトは127)
 *
 * @param	vol		ボリューム(0-127)
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_SetMasterVolume( int vol );

//--------------------------------------------------------------
/**
 * @brief	波形格納バッファのアドレス取得
 *
 * @param	none
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void* Snd_GetWaveBufAdrs(void);

//--------------------------------------------------------------
/**
 * @brief	プレイヤーヒープを作成(snd_test.cでのみ使用)
 *
 * @param	player_no	プレイヤーナンバー
 * @param	size		プレイヤーヒープサイズ
 *
 * @retval	"TRUE=成功、FALSE=失敗"
 */
//--------------------------------------------------------------
extern BOOL Snd_PlayerHeapCreate( int player_no, u32 size );


//==============================================================================================
//
//	フィールドから切り替わる時に呼ぶ必要がある削除関数
//
//	１）戦闘に入る
//	２）部屋に入る
//	３）毒ゲームオーバー
//	４）自転車に乗った時
//	５）波乗りした時
//	他には何かあるか？？
//
//==============================================================================================


//==============================================================================================
//
//	fld_bgmで使用する関数
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	バンク切り替えるかフラグセット
 *
 * @param	no		SND_BANK_CONTINUE,SND_BANK_CHANGE
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_BankFlagSet( int no );

//--------------------------------------------------------------
/**
 * @brief	バンク切り替えるかフラグ取得
 *
 * @param	none
 *
 * @retval	"SND_BANK_CONTINUE,SND_BANK_CHANGE"
 */
//--------------------------------------------------------------
extern u8 Snd_BankFlagGet();

//--------------------------------------------------------------
/**
 * @brief	フェードアウト → BGM再生(SND_SCENE_FIELD固定)
 *
 * @param	no			シーケンスナンバー
 * @param	frame		フレーム数
 * @param	next_wait	次のBGMを鳴らすまでのウェイト
 * @param	flag		0=昼、1=夜、0xff=無効(何もしない)
 * @param	adrs		フェードデータのアドレス
 *
 * @retval	"0=何もしない、1=開始"
 *
 * フェードカウンターをセットしています
 */
//--------------------------------------------------------------
extern BOOL Snd_FieldSceneFadeOutNextPlaySet( u16 no, int frame, int next_wait, u8 flag, void* adrs );

//--------------------------------------------------------------
/**
 * @brief	フェードアウト → BGM再生
 *
 * @param	scene		シーン(場面)ナンバー
 * @param	no			シーケンスナンバー
 * @param	frame		フレーム数
 * @param	next_wait	次のBGMを鳴らすまでのウェイト
 * @param	flag		0=昼、1=夜
 * @param	adrs		フェードデータのアドレス
 *
 * @retval	"0=何もしない、1=開始"
 *
 * フェードカウンターをセットしています
 */
//--------------------------------------------------------------
extern BOOL Snd_FadeOutNextPlaySet(u8 scene, u16 no,int frame,int next_wait,u8 flag, void* adrs);

//--------------------------------------------------------------
/**
 * @brief	フェードアウト → BGMフェードイン(SND_SCENE_FIELD固定)
 *
 * @param	no			シーケンスナンバー
 * @param	frame		フレーム数
 * @param	next_wait	次のBGMを鳴らすまでのウェイト
 * @param	next_frame	次のBGMのフェードインフレーム数
 * @param	flag		バンクを切り替えるか(SND_BANK_CONTINUE、SND_BANK_CHANGE)
 * @param	adrs		フェードデータのアドレス
 *
 * @retval	"0=何もしない、1=開始"
 *
 * フェードカウンターをセットしています
 */
//--------------------------------------------------------------
extern BOOL Snd_FieldSceneFadeOutNextFadeInSet( u16 no, int frame, int next_wait, int next_frame, u8 flag, void* adrs );

//--------------------------------------------------------------
/**
 * @brief	フェードアウト → BGMフェードイン(シーン定義はsnd_tool.h参照)
 *
 * @param	scene		シーン(場面)ナンバー
 * @param	no			シーケンスナンバー
 * @param	frame		フレーム数
 * @param	next_wait	次のBGMを鳴らすまでのウェイト
 * @param	next_frame	次のBGMのフェードインフレーム数
 * @param	flag		0=昼、1=夜、0xff=無効(何もしない)
 * @param	adrs		フェードデータのアドレス
 *
 * @retval	"0=何もしない、1=開始"
 *
 * フェードカウンターをセットしています
 */
//--------------------------------------------------------------
extern BOOL Snd_FadeOutNextFadeInSet( u8 scene, u16 no, int frame, int next_wait, int next_frame, u8 flag, void* adrs );

//--------------------------------------------------------------
/**
 * @brief	トラックフェードセット
 *
 * @param	no		シーケンスナンバー
 * @param	flag	0=昼、1=夜
 * @param	adrs	フェードデータのアドレス
 *
 * @retval	"0=何もしない、1=開始"
 */
//--------------------------------------------------------------
extern BOOL Snd_TrackFadeSet( u16 no, u8 flag, void* adrs );

//--------------------------------------------------------------
/**
 * @brief	トラックフェード"データ"セット
 *
 * @param	adrs	フェードデータのアドレス
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_TrackFadeDataSet( void* adrs );


//==============================================================================================
//
//	d_noharaで使用する関数(デバック用)
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	波形再生用のチャンネルを解放する(デバック処理)
 *
 * @param	none
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_DebugNormalChannelFree();


//==============================================================================================
//
//	snd_testで使用する関数(デバック用)
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	バンクロード
 *
 * @param	no		バンクナンバー
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_DebugLoadBank( u16 no );


//==============================================================================================
//
//	図鑑関連
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	波形データのアドレスからサンプルデータのアドレスを取得
 *
 * @param	p_data		波形データのアドレス
 *
 * @retval	"サンプルデータのアドレス、NULL=失敗"
 */
//--------------------------------------------------------------
extern const u8* Snd_WaveDataSampleAdrsGet( const SNDWaveData* p_data );

//--------------------------------------------------------------
/**
 * @brief	波形データのアドレスからサンプルデータの配列の大きさを取得
 *
 * @param	p_data		波形データのアドレス
 *
 * @retval	"サンプルデータの配列の大きさ、0=失敗"
 */
//--------------------------------------------------------------
extern const u32 Snd_WaveDataSampleSizeGet( const SNDWaveData* p_data );

//--------------------------------------------------------------
/**
 * @brief	波形データのアドレスを取得(図鑑専用)
 *
 * @param	wave_arc_no	波形アーカイブ番号(ポケモンナンバー)
 *
 * @retval	"波形データ構造体のアドレス、NULL=失敗"
 *
 * 1)BGMの後ろを開放
 * 2)波形アーカイブロード
 * の処理をしているので注意！
 */
//--------------------------------------------------------------
extern const SNDWaveData* Snd_ZukanWaveDataSet( int wave_arc_no );

//--------------------------------------------------------------
/**
 * @brief	波形データの再生しているサンプルデータ要素数を返す
 *
 * @param	handle_no	ハンドルナンバー
 * @param	p_data		波形データのアドレス
 *
 * @retval	"要素数"
 */
//--------------------------------------------------------------
extern u32 Snd_PlayerGetSampleTick( int handle_no, const SNDWaveData* p_data );

//--------------------------------------------------------------
/**
 * @brief	波形データの再生しているサンプルデータ要素数を返す(図鑑用)
 *
 * @param	handle_no	ハンドルナンバー
 * @param	p_data		波形データのアドレス
 * @param	pitch		設定しているピッチ
 *
 * @retval	"要素数"
 */
//--------------------------------------------------------------
extern u32 Snd_ZukanPlayerGetSampleTick( int handle_no, const SNDWaveData* p_data, int pitch );

//--------------------------------------------------------------
/**
 * @brief	ティック数取得
 *
 * @param	p_data		波形データのアドレス
 *
 * @retval	"ティック数"
 */
//--------------------------------------------------------------
extern u32 Snd_PlayerGetTick( int handle_no );

//--------------------------------------------------------------
/**
 * @brief	波形レベルセット
 *
 * @param	p_data		波形データのアドレス
 * @param	buf			格納するバッファのポインタ
 * @param	max			格納するバッファの最大数
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_ZukanWaveLevelSet( const SNDWaveData* p_data, u8* buf, int max );

//--------------------------------------------------------------
/**
 * @brief	波形レベルセット(図鑑用)
 *
 * @param	p_data		波形データのアドレス
 * @param	buf			格納するバッファのポインタ
 * @param	max			格納するバッファの最大数
 * @param	pitch		設定しているピッチ
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_ZukanWaveLevelSet_New( const SNDWaveData* p_data, u8* buf, int max, int pitch );











//--------------------------------------------------------------
/**
 * @brief	"デバック"　波形データ表示
 *
 * @param	start		表示するデータの開始位置
 * @param	end			表示するデータの終了位置
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_DebugWaveDataPut( const SNDWaveData* p_data, u32 start, u32 end );

//--------------------------------------------------------------
/**
 * @brief	"デバック"　波形レベル表示
 *
 * @param	tick		現在のティック数
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_DebugWaveLevelGet( u32 tick );

//--------------------------------------------------------------
/**
 * @brief	シーケンスローカルワークを変更する
 *
 * @param	num		シーケンスローカルワーク"0"にセットする値
 *
 * @retval	"成功=TRUE、失敗=FALSE"
 *
 * 色々出来そうだが、今回は使用を限定しておく！
 */
//--------------------------------------------------------------
extern BOOL Snd_PlayerWriteVariable( s16 num );

//--------------------------------------------------------------
/**
 * @brief	使用可能チャンネル操作、リバーブ設定
 *
 * @param	flag	1=セット、0=クリア
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_BgmChannelSetAndReverbSet( int flag );

//--------------------------------------------------------------
/**
 * @brief	プレイヤーの音量操作(デフォルトは127が設定されている)
 *
 * @param	player_no	プレイヤーナンバー
 * @param	volume		ボリューム
 *
 * @retval	none
 *
 * 使用後は、必ず127に戻してください！
 */
//--------------------------------------------------------------
extern void Snd_PlayerSetPlayerVolume( int player_no, int volume );

//--------------------------------------------------------------
/**
 * @brief	鳴き声を２つ再生出来るフラグの操作
 *
 * @param	flag		0=OFF,1=ON
 *
 * @retval	none
 *
 * 使用後は、必ず0=OFFに戻してください
 *
 * 基本的にバトル(２匹出す時)でしか使用しないはず！
 */
//--------------------------------------------------------------
extern void Snd_PMVoiceDoubleFlagSet( BOOL flag );

//--------------------------------------------------------------
/**
 * @brief	バトル録画再生フラグの操作
 *
 * @param	flag		0=OFF,1=ON
 *
 * @retval	none
 *
 * 使用後は、必ず0=OFFに戻してください
 *
 * br_manager.cからしか呼ばれない。
 */
//--------------------------------------------------------------
extern void Snd_BattleRecFlag( BOOL flag );



//-----------------------------------------------------------------------------
// シーケンス変数操作	080617GS 名木橋追加
//-----------------------------------------------------------------------------
//----------------------------------------------------------------
/**
 *	@brief	シーケンスローカル変数の読み取り
 *			シーケンスローカル変数はサウンド側でシーケンスに設定した値を
 *			プログラム側で読むことが出来ます。
 *			つまりこれを使えば同期だったりができるハズ。
 *			詳しくは「シーケンスデータマニュアル31ページ参照」
 *
 *	@param	u16 bgm_no	読み取るBGM番号
 *	@param	var_no		読み取る変数番号
 *	@param	*p_ret		読み取った値（-1が初期値です）
 *
 *	@retval	TRUE		読み取り成功
 *	@retval FALSE		不成功
 */
//------------------------------------------------------------------
extern BOOL Snd_ReadVariableByBgmNo( u16 bgm_no, u8 var_no, s16 *p_ret );


//==============================================================================================
//
//	足音関連
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	足音操作
 *
 * @param	no		SEシーケンスナンバー
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_FootStepControl( u16 no );


//--------------------------------------------------------------
/**
 * @brief	通信バトル判別フラグセット
 *
 * @param	flag	1=通信中、0=通常
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_CommBattleFlagSet( u8 flag );

//--------------------------------------------------------------
/**
 * @brief	通信バトル判別フラグチェック
 *
 * @param	none
 *
 * @retval	"1=通信中、0=通常"
 */
//--------------------------------------------------------------
extern u8 Snd_CommBattleFlagCheck( void );

//--------------------------------------------------------------
/**
 * @brief	ゲームボーイで再生するかフラグセット
 *
 * @param	flag	1=ゲームボーイ、0=通常
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_GameBoyFlagSet( u8 flag );

//--------------------------------------------------------------
/**
 * @brief	ゲームボーイで再生するかフラグチェック
 *
 * @param	none
 *
 * @retval	"1=ゲームボーイ、0=通常"
 */
//--------------------------------------------------------------
extern u8 Snd_GameBoyFlagCheck( void );

//--------------------------------------------------------------
/**
 * @brief	ゲームボーイを使用した時の処理
 *
 * @param	none
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_GameBoyItemUse( void );

//--------------------------------------------------------------
/**
 * @brief	ゲームボーイのオフセット取得(★暫定なので注意！)
 *
 * @param	none
 *
 * @retval	"オフセット"
 */
//--------------------------------------------------------------
//extern int Snd_GameBoyOffsetGet( void );

//--------------------------------------------------------------
/**
 * @brief	16音から、3音のシーケンスナンバー取得
 *
 * @param	no		シーケンスナンバー
 *
 * @retval	"シーケンスナンバー(見つからなかった時はそのままの値を返します)"
 */
//--------------------------------------------------------------
extern u16 Snd_GameBoySeqNoGet( u16 ds_seq_no );

//--------------------------------------------------------------
/**
 * @brief	3音から、16音のシーケンスナンバー取得
 *
 * @param	no		シーケンスナンバー
 *
 * @retval	"シーケンスナンバー(見つからなかった時はそのままの値を返します)"
 */
//--------------------------------------------------------------
extern u16 Snd_DSSeqNoGet( u16 gb_seq_no );

//--------------------------------------------------------------
/**
 * @brief	シーケンストラックの確保チャンネルを変更
 *
 * @param	no			シーケンスナンバー
 * @param	bitmask		トラックビットマスク
 * @param	ch_bitflag	確保可能なチャンネルのビットフラグ
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_PlayerSetTrackAllocatableChannel( u16 no, u16 bitmask, u32 ch_bitflag );

//--------------------------------------------------------------
/**
 * @brief	BGM、MEのシーケンストラックの確保チャンネルを変更(固定)
 *
 * @param	none
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_PlayerSetTrackAllocatableChannelFix( void );

//--------------------------------------------------------------
/**
 * Snd_StopExが呼ばれたかどうかを監視する
 *
 * Snd_EvMapChangeBgmPlayとSnd_FieldMapInitBgmPlayの
 * 該当箇所をOn/Offで囲んでください。
 */
//--------------------------------------------------------------
extern void Snd_Watching_StopEx_Switch(BOOL on_off);

//--------------------------------------------------------------
/**
 * Snd_StopExの呼び出し状態監視機能を初期化する
 *
 * ゲーム開始時、FieldMapProcEndで呼び出してください
 */
//--------------------------------------------------------------
extern void Snd_Watching_StopEx_Init(void);

#endif

